
package main.old.new_2023.last.month_9;


import java.util.*;

/**
 * @Description: todo 1222. 可以攻击国王的皇后
 * 在一个 8x8 的棋盘上，放置着若干「黑皇后」和一个「白国王」。
 * 给定一个由整数坐标组成的数组 queens ，表示黑皇后的位置；以及一对坐标 king ，表示白国王的位置，返回所有可以攻击国王的皇后的坐标(任意顺序)。
 *
 * todo 1431. 拥有最多糖果的孩子
 * 给你一个数组 candies 和一个整数 extraCandies ，其中 candies[i] 代表第 i 个孩子拥有的糖果数目。
 * 对每一个孩子，检查是否存在一种方案，将额外的 extraCandies 个糖果分配给孩子们之后，此孩子有 最多 的糖果。注意，允许有多个孩子同时拥有 最多 的糖果数目。
 *
 * todo 238. 除自身以外数组的乘积
 * 给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
 * 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
 * 请不要使用除法，且在 O(n) 时间复杂度内完成此题。
 *
 * @Author: Take-off
 * @Date: 1:00 PM 2023/6/
 * @Param:
 * @return:
 **/
public class Solution0914 {

    //除自身以外数组的乘积
    public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        if (len == 0) return new int[0];
        int[] ans = new int[len];
        ans[0] = 1;
        int tmp = 1;
        for (int i = 1; i < len; i++) {
            ans[i] = ans[i - 1] * nums[i - 1];
        }
        for (int i = len - 2; i >= 0; i--) {
            tmp *= nums[i + 1];
            ans[i] *= tmp;
        }
        return ans;
    }

    //拥有最多糖果的孩子
    public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
        List<Boolean> result =new ArrayList<>();
        int length = candies.length;
        int[] addCandies = new int[length];
        int max = candies[0];
        for (int i = 0; i< length;i++){
            max = Math.max(max,candies[i]);
            addCandies[i] = candies[i]+extraCandies;
        }
        for (int candy:addCandies){
            result.add(candy >= max);
        }
        return result;
    }

    //可以攻击国王的皇后
    private final static int[][] directions = {{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
    public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
        //8个方向从国王看向皇后，看到后break，将皇后的二维数组 ，横纵坐标判断是否存在就行
        boolean[][] isQueen = new boolean[8][8];
        for (int[] queen:queens){
            isQueen[queen[0]][queen[1]] = true;
        }
        List<List<Integer>> ans = new ArrayList<>();
        for (int[] direction:directions){
            int x=king[0] + direction[0];
            int y=king[1] + direction[1];
            while (x >=0 && x<8 &&y >=0 && y<8){
                if (isQueen[x][y]){
                    ans.add(Arrays.asList(x,y));
                    break;
                }
                x += direction[0];
                y += direction[1];
            }
        }
        return ans;
    }

}
